package com.fanrenqiji.common.security;

import org.apache.shiro.codec.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class Cryptos {
	
	
	public static final String ALGORITHM_DES = "DESede/ECB/PKCS5Padding";

    /**

    * 获取加密密钥

    * @return

    */

    public static String getSecretKey(){

              /*String desKey = Configuration.getValue("lenovo.tripleDes.key");*/

              String desKey = "1SDF3DEFLENASDOASDVO12AS";

              return desKey;

    }

   

    /**

    * 3DES加密方法

    *

     * @param value  待加密信息

    * @param desKey 密钥
	
    * @return  3DES加密后用Base64编码的字符串

    */

	public static String encrypt(String value, String desKey) {

              String result = null;

              try {

                       SecretKeySpec key = new SecretKeySpec(desKey.getBytes(), 0, 24, "DESede");

                       Cipher cipher = Cipher.getInstance(ALGORITHM_DES);

                       cipher.init(Cipher.ENCRYPT_MODE, key);

                       result = new String(Base64.encode(cipher.doFinal(value.getBytes("UTF-8"))), "UTF-8");

              } catch (Exception e) {

                       e.printStackTrace();

              }       

              return result;

             

    }

   

    /**

    * 3DES解密方法

    *

     * @param value  3DES加密后用Base64编码的字符串

    * @param desKey 密钥

    * @return 加密原文

    */

    public static String decrypt(String value, String desKey) {

              String result = null;

              try {

                       SecretKeySpec key = new SecretKeySpec(desKey.getBytes(), 0, 24, "DESede");

                       Cipher cipher = Cipher.getInstance(ALGORITHM_DES);

                       cipher.init(Cipher.DECRYPT_MODE, key);

                       result = new String(cipher.doFinal(Base64.decode(value)), "UTF-8");

              } catch (Exception e) {

                       e.printStackTrace();

              }

              return result;

    }

   

    /**

    * 3Des使用默认的key加密（建议优先考虑）

    * @param value 待加密信息

    * @return  3DES加密后用Base64编码的字符串

    */

    public static String encrypt(String value){

              String result = encrypt(value, getSecretKey());

              return result;

    }

   

    /**

     * 3Des使用默认的key解密 （建议优先考虑）

     * @param value 3DES加密后用Base64编码的字符串

    * @return 加密原文

    */

    public static String decrypt(String value){

              String result = decrypt(value, getSecretKey());

              return result;

    }

    /**

    * 3Des使用默认的key加密（建议优先考虑） ,用于加密的URL使用

    * @param value 待加密信息

    * @return  3DES加密后用Base64编码的字符串

    */

    public static String encryptToURL(String value){

              String result = encrypt(value, getSecretKey());

              // 将加密后字符串中“+”、“/”、“=”转换成替代字符串

              result = result.replaceAll("[+]", "%2B");

              result = result.replaceAll("[/]", "%2F");

              result = result.replaceAll("[=]", "%3D");

              return result;

    }

   

    /**

    * 3Des的key加密（建议优先考虑） ,用于加密的URL使用

    * @param value 待加密信息

    * @return  3DES加密后用Base64编码的字符串

    */

    public static String encryptToURL(String value, String key){

              String result = encrypt(value, key);

              // 将加密后字符串中“+”、“/”、“=”转换成替代字符串

              result = result.replaceAll("[+]", "%2B");

              result = result.replaceAll("[/]", "%2F");

              result = result.replaceAll("[=]", "%3D");

              return result;

    }
}
